﻿define(
    ['ko'],
    function (ko) {
        var
            loadTemplate = function (templateHolder, templateName, callback) {
            //var templatePath = getTemplatePath(templateName) + ".html"
            var templatePath = templateName + ".html";
            $(templateHolder).load(templatePath, function () {
                if (callback) {
                    callback();
                }

            });
        },
        jsonToString = function (object) {
                if (_.isObject(object)) {
                    return JSON.stringify(object);
                } else {
                    return object;
                }
            },
            mapMemoToArray = function (items) {
                var underlyingArray = [];
                for (var prop in items) {
                    if (items.hasOwnProperty(prop)) {
                        underlyingArray.push(items[prop]);
                    }
                }
                return underlyingArray;
            },
                    cloneObject = function (obj) {
            // Handle the 3 simple types, and null or undefined
            if (null == obj || "object" != typeof obj) return obj;

            // Handle Date
            if (obj instanceof Date) {
                var copy = new Date();
                copy.setTime(obj.getTime());
                return copy;
            }

            // Handle Array
            if (obj instanceof Array) {
                var copy = [];
                for (var i = 0, len = obj.length; i < len; i++) {
                    copy[i] = cloneObject(obj[i]);
                }
                return copy;
            }

            // Handle Object
            if (obj instanceof Object) {
                var copy = {};
                for (var attr in obj) {
                    if (obj.hasOwnProperty(attr)) copy[attr] = cloneObject(obj[attr]);
                }
                return copy;
            }

            throw new Error("Unable to copy obj! Its type isn't supported.");
        },        formatUriRequestData = function (requestData) {
            var encodedData = '';

            requestData = requestData.replace('%', encodeURIComponent('%').toString());
            //                encodedData = encodeURIComponent(requestData).toString();
            //                encodedData = encodedData.replace(/#/g, escape("#"));

            var specialCharacters = ['@', '/', '+', '-', '(', ')', '*', '.'];
            for (var i = 0; i < requestData.length; i++) {
                if (specialCharacters.indexOf(requestData.charAt(i)) >= 0) {
                    requestData = requestData.replace(requestData.charAt(i), encodeURIComponent(requestData.charAt(i)));
                }
            }

            encodedData = requestData.replace(/#/g, escape("#"));

            return encodedData;
        },getCurrentLanguage = function(){
        	return "en";
        };

        return {
            loadTemplate: loadTemplate,
            jsonToString: jsonToString,
            mapMemoToArray: mapMemoToArray,
            cloneObject: cloneObject,
            formatUriRequestData: formatUriRequestData,
            getCurrentLanguage: getCurrentLanguage
        };
    });